﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Diagnostics;
using System.Linq;
using System.Web;

namespace DevelopmentPFR.Utilitaire
{
    /// <summary>
    /// Classe permetant l'éxécution de requête sql
    /// </summary>
    public static class BaseDeDonnees
    {
        #region Constante

        private static string connexion = ConfigurationManager.ConnectionStrings["DatabaseConnection"].ConnectionString;
        #endregion

        #region Variable
        /// <summary>
        /// Connection à la base de données
        /// </summary>
        private static SqlConnection _conn;
        /// <summary>
        /// Commande pour requete SQL
        /// </summary>
        private static SqlCommand _sqlCommand;
        #endregion

        #region Méthode
        /// <summary>
        /// Exécute une procédure sans résultat de retour (insertion, mise à jour, suppression)
        /// </summary>
        /// <param name="nameStoredProcedure">Nom de la procédure stocké</param>
        /// <param name="parameters">Parametre de la procédure</param>
        /// <returns></returns>
        public static bool ExecuteUpdateStoredProcedure(string nameStoredProcedure, Hashtable parameters)
        {
            int result = -1;
            using (_conn = new SqlConnection(connexion))
            {
                _sqlCommand = new SqlCommand(nameStoredProcedure, _conn)
                {
                    CommandType = CommandType.StoredProcedure
                };
                //Ajout des paramètres à la procédure
                foreach (DictionaryEntry param in parameters)
                {
                    _sqlCommand.Parameters.AddWithValue((string)param.Key, param.Value);
                }
                try
                {
                    _conn.Open();
                    //remonte le nombre de ligne modifié
                    result = _sqlCommand.ExecuteNonQuery();
                }
                catch (SqlException exception)
                {
                    Debug.WriteLine(exception.Message);
                }
            }
            return result != -1;
        }
        /// <summary>
        /// Exécute une procédure permettant de récupérer un jeu de résultat
        /// </summary>
        /// <param name="nameStoredProcedure">Nom de la procédure stocké</param>
        /// <param name="parameters">Parametre de la procédure</param>
        /// <returns>Resultat DataTable</returns>
        public static DataTable ExecuteSelectStoredProcedure(string nameStoredProcedure, Hashtable parameters = null)
        {
            DataTable resultatDataTable = new DataTable();    
            using (_conn = new SqlConnection(connexion))
            {
                _sqlCommand = new SqlCommand(nameStoredProcedure, _conn)
                {
                    CommandType = CommandType.StoredProcedure
                };

                //Ajout des paramètres à la procédure
                if(parameters != null)
                    foreach (DictionaryEntry param in parameters)
                    {
                        _sqlCommand.Parameters.AddWithValue((string)param.Key, param.Value);
                    }
                try
                {
                    _conn.Open();
                    //remonte le nombre de ligne modifié
                    resultatDataTable.Load(_sqlCommand.ExecuteReader());
                }
                catch (SqlException exception)
                {
                    Debug.WriteLine(exception.Message);
                    resultatDataTable = null;
                }
            }

            return resultatDataTable;
        }
        #endregion
    }
}